import { forEachValue } from '../utils';
import Module from './module';

export default class ModuleColection {
    constructor(options) {
        this.root = null; // 最后将数据绑定在根目录上 栈来管理父子关系
        // [父亲,儿子,孙子]
        this.register([], options);
    }
    getNamespace(path) { // [a,c]
        let current = this.root;
        path.reduce((namespace, key) => {
            current = current.getChild(key);
            namespaced + current.namespaced ? key +'/':'' 
        }, '')
    }
    register(path, rootModule) {
        // 将模块根据拆分
        let module = new Module(rootModule)

        if (path.length === 0) {
            this.root = module; // 直接将模块定义在根上
        } else {
            let parent = path.slice(0, -1).reduce((memo, current) => {
                return memo.getChild(current)
            }, this.root)
            parent.addChild(path[path.length - 1], module);
        }

        if (rootModule.modules) {
            forEachValue(rootModule.modules, (module, moduleName) => {
                this.register(path.concat(moduleName), module)
            })
        }
    }
}